package tech.yunjing.train.dao;


import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import tech.yunjing.train.util.ReflectionMongoDBUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * purpose：实现mongodb的方法类
 * Created by 吕祥 on 2017/6/8.
 */
public class UserInfoMongoDaoImpl<T> implements UserInfoMongoDao<T> {

    /**
     * spring mongodb　集成操作类　
     */
    @Resource
    protected MongoTemplate mongoTemplate;

    /**
     * 注入mongodbTemplate
     *
     * @param mongoTemplate 模板
     */
    protected void setMongoTemplate(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    /**
     * 获得泛型类
     */
    private Class<T> getEntityClass() {
        return ReflectionMongoDBUtils.getSuperClassGenricType(getClass());
    }

    /**
     * 根据userAccount查询
     * @param userAccount 用户账号
     * @return 用户对象
     */
    @Override
    public T findByUserAccount(String userAccount) {
        return mongoTemplate.findById(userAccount,this.getEntityClass());
    }

    /**
     * 保存数据
     * @param userInfo 实体类
     * @return 用户对象
     */
    @Override
    public T saveUserInfo(T userInfo) {
        mongoTemplate.save(userInfo);
        return userInfo;
    }

    /**
     * 判断是否存在
     * @param userAccount 用户账号
     * @return ture = 存在 false = 不存在(可用)
     */
    @Override
    public boolean isUserAccountExists(String userAccount) {
        return mongoTemplate.collectionExists(userAccount);
    }

    /**
     * 根据条件查询一个用户信息
     * @param query 查找对象
     * @return 用户信息
     */
    @Override
    public T findOneUserInfo(Query query) {
        return mongoTemplate.findOne(query,getEntityClass());
    }

    /**
     * 查询所有用户信息
     * @param userInfo 用户信息
     * @return 用户对象集合
     */
    @Override
    public List<T> findAllUserInfo(T userInfo) {
        return mongoTemplate.findAll(this.getEntityClass());
    }

    /**
     * 根据账号修改密码
     * @param query 查找对象
     * @param update 修改对象
     * @return 查到的对象
     */
    @Override
    public T updateOneUserAccount(Query query, Update update) {
        return mongoTemplate.findAndModify(query, update,this.getEntityClass());
    }

    /**
     * 根据账号 逻辑删除账户
     * @param query 查找对象
     * @param update 修改对象
     * @return 提示是否成功
     */
    @Override
    public T removeOneUserInfo(Query query, Update update) {
        return mongoTemplate.findAndModify(query, update,this.getEntityClass());
    }

}
